#!/usr/bin/env node

const request = require('superagent');
const shell = require('shelljs');
const utils = require('./js/utils');
const p = require('path');
const os = require('os');
const _ = require('lodash');
const fs = require('fs-extra');
const program = require('./js/dialog').commander();
const logFile = p.join(os.homedir(), '.xn_history', '.xn_xsnippet_history');
const configFile = p.join(os.homedir(), '.xsnippet_config');
let _path = p.join(os.homedir(), 'AppData/Roaming/Code/User/snippets');

function getTargetFile(target) {
    let targetFile;
    if (!p.extname(target)) {
        targetFile = p.join(_path, `${target}.json`);
        if (fs.existsSync(targetFile)) {
            return targetFile;
        }
        targetFile = p.join(_path, `${target}.code-snippets`);
        if (fs.existsSync(targetFile)) {
            return targetFile;
        }
    }
    return p.join(_path, target);
}

program
.version('0.0.1')
.option('-m, --template <template>', '模板文件')
.option('-p, --path [../snippets]', '设置vscode的配置文件路径')
.option('-t, --target [file]', '目标文件，如果为空，则为{模板文件扩展名}.json')
.option('-k, --key [key]', '提示字段，首次不能为空')
.option('-x, --prefix [prefix]', '目标字段的prefix，如果为空，则为模板文件名')
.option('-d, --data <json>', '其他参数', (v)=>eval('v='+v), {})
.option('-f, --force', '强制添加', '')
.option('-c, --config', 'show config', '')
.option('-l, --log [n]', 'show log n items, default: 10')
.parse(process.argv);

let options = {};
try {
    options = fs.readJSONSync(configFile);
} catch (e) { }

let { template, target, key, prefix, data, force } = program;
_path = program.path || options.path || _path;
if (program.log) {
    console.log(shell.tail({'-n': program.log === true ? 10 : program.log}, logFile).toString());
    process.exit(0);
}
if (program.config) {
    console.log({ path: _path });
    process.exit(0);
}
if (!fs.existsSync(_path)) {
    console.log(`vscode的配置文件路径: ${_path}, 请重新配置`);
    process.exit(0);
}
if (!template || !fs.existsSync(template)) {
    console.log(`模板文件不存在`);
    process.exit(0);
}
target = target || data.target;
data.prefix = prefix || data.prefix;
const matches = template.match(/^(.*)\.(.*?)$/);
if (matches) {
    target = target || `${matches[2]}.json`;
    data.prefix = data.prefix || matches[1];
}
let targetFile = getTargetFile(target);
let targetFileExists = fs.existsSync(targetFile);
let params = {};
if (targetFileExists) {
    params = utils.getFileJSON(targetFile);
}
if (!key && data.prefix) { // 没有设置key的时候可以通过prefix去查找到key
    key = _.findKey(params, o=>o.prefix === data.prefix);
}
if (!key) {
    console.log(`请用 -k 设置提示字段`);
    process.exit(0);
}
if (!params[key] && !force) {
    console.log(`目标字段不存在，如果要强制添加，请使用--force`);
    process.exit(0);
}
if (!data.prefix && !params[key]) {
    console.log(`请用 -x 设置prefix`);
    process.exit(0);
}
data.body = fs.readFileSync(template, 'utf-8').split(/\r?\n/);
params[key] = { ...(params[key]||{}), ...data};

fs.writeFileSync(targetFile, JSON.stringify(params, null, 2), 'utf-8');
console.log(`成功更新snippet到${targetFile}`);